/**
 * @p.md
 * 
 * Persistent 接口定义了持久化 Actor 的基本功能
 */
import { Context } from '../actor/context';

/**
 * 事件类型枚举
 */
export enum EventType {
  /**
   * 普通事件
   */
  Event,
  
  /**
   * 快照
   */
  Snapshot
}

/**
 * 快照选择条件
 */
export interface SnapshotSelectionCriteria {
  /**
   * 最大序列号
   */
  maxSequenceNr: number;
  
  /**
   * 最小序列号
   */
  minSequenceNr: number;
  
  /**
   * 最大时间戳（可选）
   */
  maxTimestamp?: number;
  
  /**
   * 最小时间戳（可选）
   */
  minTimestamp?: number;
}

/**
 * 事件选择条件
 */
export interface EventSelectionCriteria {
  /**
   * 最大序列号
   */
  maxSequenceNr: number;
  
  /**
   * 最小序列号
   */
  minSequenceNr: number;
}

/**
 * 持久化 Actor 接口
 */
export interface Persistent {
  /**
   * 持久化标识符，用于唯一标识一个持久化 Actor
   */
  persistenceId: string;
  
  /**
   * 接收恢复事件
   * @param context 恢复上下文
   */
  receiveRecover(context: RecoverContext): void;
  
  /**
   * 接收命令
   * @param context 命令上下文
   */
  receiveCommand(context: CommandContext): void;
}

/**
 * 持久化上下文接口，扩展基本 Context
 */
export interface PersistentContext extends Context {
  /**
   * 持久化事件
   * @param event 要持久化的事件
   */
  persist(event: any): Promise<void>;
  
  /**
   * 批量持久化事件
   * @param events 要持久化的事件数组
   */
  persistAll(events: any[]): Promise<void>;
  
  /**
   * 创建快照
   * @param snapshot 快照数据
   */
  snapshot(snapshot: any): Promise<void>;
  
  /**
   * 删除快照
   * @param criteria 选择条件
   */
  deleteSnapshots(criteria: SnapshotSelectionCriteria): Promise<void>;
  
  /**
   * 删除事件
   * @param criteria 选择条件
   */
  deleteEvents(criteria: EventSelectionCriteria): Promise<void>;
}

/**
 * 恢复上下文接口，用于恢复阶段
 */
export interface RecoverContext extends Context {
  /**
   * 当前恢复的事件或快照
   */
  event: any;
  
  /**
   * 事件类型
   */
  eventType: EventType;
  
  /**
   * 事件索引
   */
  eventIndex: number;
}

/**
 * 命令上下文接口，用于命令处理阶段
 */
export interface CommandContext extends PersistentContext {
  /**
   * 当前索引
   */
  index: number;
} 